/* 
class类当中实例对象上的值
一个来源：形参默认值
第二个来源：创建实例对象时传入的实参

*/

class Person1 {
    name: string;
    age: number;
    constructor(name: string = 'zhangsan', age: number = 12) {
        this.name = name;
        this.age = age;
    }
    // 当get的到的值，没有写set时，默认是只读属性
    get info(): string {
        return this.name + this.age;
    }
    /*   set info(value) {
          // 得到拦截后的新值
            console.log(value);
      } */

}
// person2是person1当中形参默认值的简洁版的写法，创建实例对象时就不能传参了
class Person2 {
    name: string = 'xiaohong';
    age: number = 12
}
// 存取器 get  set
// 创建实例对象
let zhangsan = new Person1();
console.log(zhangsan);
let lisi = new Person1('lisi', 10);
console.log(lisi);

let xiaohong = new Person2();
console.log(xiaohong);
// let xiaoming = new Person2('111')

// get set 同vue计算属性是类型,根据初始化的值，进行操作得到新值
// get 能计算得到新值  get 后面函数的return的值
console.log(zhangsan);
// set 拦截器  当get计算得到的新值发生变化，就会触发set ,set 就会拦截，得到改变后的新值
// zhangsan.info = '石松峰12';



// 多态
// 有父 有子
// shishi是父类 songsong是子类  FengFeng是另一个子类
class ShiShi {
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    //原型对象上的方法
    jump(height: number): string {
        return `${this.name}跳${height}米`
    }
}

class SongSong extends ShiShi {
    constructor(name: string, age: number) {
        super(name, age);
    }
    //jump 在其中继承父类原型对象上的jump  super.jump()
    jump(height: number): string {
        return super.jump(height);
    }
}

class FengFeng extends ShiShi {
    constructor(name: string, age: number) {
        super(name, age);
    }
    //jump 在其中继承父类原型对象上的jump  super.jump()
    jump(height: number): string {
        return super.jump(height);
    }
}

// 创建实例对象
let shi: ShiShi = new ShiShi('shi', 10);
console.log(shi);
console.log(shi.jump(50));

let song: ShiShi = new SongSong('song', 5);
console.log(song);
console.log(song.jump(100));

let feng: ShiShi = new FengFeng('song', 6);
console.log(feng);
console.log(feng.jump(150));

// 不同的类型的对象针对相同的方法，产生了不同的行为  现象称为多态